home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 12: Textmags & Docs / nf_archive_12.iso / MAGS / SOURCES / ATARI_SRC.ZIP / atari source / DSHJ2 / MENU.C1 < prev    next >
Encoding:
Text File  |  2001-02-10  |  43.5 KB  |  1,745 lines

  1. /**************************************************************************/
  2. /*  FILE:  MENU.C        PROGRAM TITLE: DeskSET II Alpha Version   */
  3. /*  Date Created: 01/08/88                          */ 
  4. /*  Last Modified: 01/31/89                          */
  5. /*                                      */
  6. /*  Description: MENU ROUTINES                          */
  7. /*  Routines:    o do_view_size()    -  change viewing scale handler   */
  8. /*         o genesis_region()    -  Create a new region           */
  9. /*        o graphic_region()    -  Create Graphic Region      */
  10. /*        o close_region()    -  Close a regions          */
  11. /*        o draw_item()        -  Chooses function to draw with  */
  12. /*        o erase_all()        -  Deletes regions          */
  13. /*        o do_flip_page()    -  Previous and Next Page Handler */
  14. /*        o make_article()    -  Create Article          */
  15. /*        o close_article()    -  Close Article          */
  16. /*        o do_hot_link()        -  perform linking of regions      */
  17. /*        o check_top_window()    -  is preview window on top?      */
  18. /*        o display_toggle()      -  toggle to show/noshow images   */
  19. /*        o do_artdelete()    -  Delete selected article      */
  20. /*        o do_artopen()        -  Open selected article for link */
  21. /*        o reopen_region()    -  reopen a region - add primitive*/
  22. /*        o del_prim()        -  delete currect active primitive*/
  23. /*        o router_selected()    -  draw outline arnd active region*/
  24. /*        o post_edit_prim()    -  conclusion of prim edit fnctns */
  25. /*        o outline_primman()    -  Draw outline arnd active prim  */
  26. /**************************************************************************/
  27.  
  28.  
  29. /**************************************************************************/
  30. /* INCLUDE FILES                              */
  31. /**************************************************************************/
  32. #include "define.h"
  33. #include "deskset2.h"
  34. #include <obdefs.h>
  35. #include "gemdefs.h"
  36. #include <osbind.h>
  37. #include "alert.h"
  38. #include "dbase.h"
  39.  
  40. /**************************************************************************/
  41. /* DEFINES                                  */
  42. /**************************************************************************/
  43. #define MINSIZE  5000L
  44.  
  45. /**************************************************************************/
  46. /* EXTERNALS                                  */
  47. /**************************************************************************/
  48. extern int view_size;                /* Current scaling size   */
  49. extern OBJECT *ad_menu;                /* Address of menu tree   */
  50. extern OBJECT *ad_set_size;            /* Address of dialog box  */
  51. extern OBJECT *ad_point_size;            /* address of dialog box  */
  52. extern OBJECT *ad_go_page;            /* Current Page dialog      */
  53. extern OBJECT *ad_get_image;
  54. extern OBJECT *adoutput;
  55. extern OBJECT *ad_bkgrnd;
  56. extern OBJECT *ad_filebuf;
  57.  
  58. extern char rscerr2[];
  59. extern char linkerr[];
  60. extern int prev_handle;                /* Preview window handle  */
  61. extern int msg_buff[];                /* evnt multi buffer      */
  62. extern int dummy;                /* well, dummy...      */
  63. extern int curr_page;                /* current page          */
  64.  
  65. extern int ptsarray[];                /* Interface to structures*/
  66.  
  67. extern int mhandle;                /* Preview buffer handle  */
  68. extern int mxres,myres;
  69. extern int shandle;
  70. extern int phandle;
  71. extern int pxy[];
  72. extern int prev_size;
  73.  
  74. extern int (*funcs)();                /* drawing function       */
  75. extern int poly_draw();                /* polygon drawing...     */
  76. extern int ellipse_draw();            /* ellipse drawing...     */
  77. extern int circle_draw();            /* circle drawing...      */
  78. extern int box_draw();                /* box drawing...         */
  79. extern int nada();                /* null function      */
  80. extern char *winfo[][4];            /* preview text info line */
  81.  
  82. extern GRECT dpwork;                /* work area of window    */
  83. extern GRECT pwork;                /* Preview work area      */
  84.  
  85. extern int scale_set;                /* User defined scale fact*/
  86. extern GRECT page_area;             /* GRECT area Preview area*/
  87. extern long getf_article();
  88. extern long get_fpage();
  89. extern long get_npage();
  90. extern long get_fregion();            /* Get first region      */
  91. extern long get_nregion();            /* Get next region      */
  92. extern unsigned long region_ptr;        /* Pointer to curr region */
  93. extern unsigned long page_ptr;            /* Ptr to Preview Buffer  */
  94. extern unsigned long pagesc;
  95.  
  96. extern unsigned long prev_bytes;
  97.  
  98. extern int SH;                    /* Point Size...      */
  99. extern int mode_change;                /* text/mask changed?     */
  100. extern int zdevice;                /* index into xdpi/ydpi   */
  101.  
  102. extern long find_region();
  103. extern long create_region();
  104.  
  105. extern char fbuffer[];
  106. extern int cur_point_size;            /* Current Point Size      */
  107.  
  108. extern int graph_flag;
  109. extern int image_status;
  110.  
  111. extern struct txtattr gltxtattr;        /* Global text attributes */
  112. extern int glgrattr[];                /* Global graphic attrib  */
  113. extern char pathbuf[];
  114. extern int pagew,pageh;
  115. extern int blit_flag;
  116. extern int force_draw_flag;
  117. extern long do_artobj();
  118. extern long get_regart();
  119. extern char *get_lmem();
  120. extern int intout[];
  121. typedef struct dta
  122. {
  123.          char res[21];
  124.     char attr;
  125.     int  time;
  126.     int  date;
  127.     long fsize;
  128.     char str[14];
  129. } DTA;
  130.  
  131. extern DTA thedta;
  132. extern char not_found[];
  133. extern char dprint[];
  134. extern long get_curreg();
  135. extern int deferhj;
  136. extern int pxres;
  137. extern int pyres;
  138. extern int alt_offset;
  139. extern int active_prim;
  140. extern int xor_handle;
  141. extern int hpage_size;
  142.  
  143. extern char *dpath1;
  144. extern char *dpath2;
  145. extern char *dpath3;
  146. extern char *dpath4;
  147.  
  148. extern long lcalloc();
  149.  
  150. extern int BSTATE;
  151. extern int BREAL;
  152.  
  153. extern long prim_ptr;
  154. extern int active_prim;
  155.  
  156. extern int *icdata;
  157. extern int *primicons;
  158. extern BITBLK *bgicptr;
  159. extern int show_grids;
  160. extern int snap_to_grids;
  161.  
  162. extern PAGE *tpagehd;
  163. extern PAGE *tcurpage;
  164. extern int  temp_page;
  165. extern PAGE *pagehd;
  166. extern PAGE *curpage;
  167. extern PAGE *left_tmplate;
  168. extern PAGE *right_tmplate;
  169. extern int  displ_tmpl_flag;
  170.  
  171.  
  172. extern ARTICLE *rtarthd;
  173. extern ARTICLE *ltarthd;
  174. extern ARTICLE *tarthd;
  175. extern ARTICLE *arthd;
  176.  
  177. extern int multi_mode;
  178. extern FDB page_MFDB;
  179. extern int unit_type;
  180. extern int TYF_handle;
  181. extern REGION *curregion;
  182. extern FDB laser_MFDB;
  183. extern int pagetype;
  184. extern int vpage_size;
  185. extern long lmalloc();
  186. extern long pageim;
  187.  
  188. /**************************************************************************/
  189. /* GLOBAL VARIABLES                              */
  190. /**************************************************************************/
  191. char *ruler_mode[] =  {
  192.             "  Show Ruler     ^R",
  193.             "  Hide Ruler     ^R"
  194.               };
  195.  
  196.  
  197. char *mode_text[] = {                /* Menu text for modes    */
  198.             "  Show Text          ^T",
  199.             "  Show Mask          ^T"
  200.             };
  201.  
  202.  
  203. char *write_mode[] = {                /* writing mode...        */
  204.             "  Add Object   ",
  205.             "  Subtract Obj "
  206.  
  207.                      };
  208.  
  209. char *template_mode[] = {
  210.               "  Edit Base Page    ",
  211.               "  Edit Preview      "
  212.             };
  213.  
  214. char *disp_tmpl[] = {
  215.              "  Display Base Page ",     
  216.              "  Hide Base Page    "
  217.             };
  218.  
  219. int tmplate_flag;
  220. int  mode_flag;                    /* current fill mode...   */
  221. int  write_flag;                /* current writing mode   */
  222. int  print_flag;                /* Printing to Laser?      */
  223. int  article_flag;                /* 0 - no article, 1 -    */
  224.                         /* then in create article */
  225.  
  226. int  cur_scale;                    /* current scale in %     */
  227.  
  228.  
  229. #define linkSIZE 37                /* Link mouse form        */
  230. short mlink[linkSIZE] = 
  231. {
  232.     0x0000,0x0000,0x0001,0x0000,0x0001,
  233.     0x7FE0,0xFFF0,0xFFF0,0xFFF0,0xFFFE,0xFFFF,0xFFFF,0xFFFF,
  234.     0xFFFF,0xFFFF,0xFFFF,0x7FFF,0x0FFF,0x0FFF,0x0FFF,0x07FE,
  235.     0x0000,0x3FC0,0x7FE0,0x6060,0x6060,0x636C,0x676E,0x6666,
  236.     0x6666,0x76E6,0x36C6,0x0606,0x0606,0x07FE,0x03FC,0x0000
  237.  
  238. };
  239. extern short mlink1[];
  240.  
  241. int cur_primitive;                /* current primitive   */
  242.                         /* according to RCS index */
  243. int cur_pic_type;                /* Neo, IMG, Meta file    */
  244. unsigned long gl_region_ptr;            /* current OPEN/SELECTED  */
  245.                         /* pointer to region      */
  246. unsigned long gl_grregion_ptr;
  247.                         /* pointer to region      */
  248. int gl_lstyle;                    /* Global line attributes */
  249. int gl_lwidth;
  250. int gl_fstyle;                    /* Global fill attributes */
  251. int gl_findex;
  252. int gl_repel;
  253. int gl_repbounds;
  254. int gl_repoffset;
  255.  
  256. int art_append;                    /* Append region to article */
  257.                         /* or insert in middle if 0 */
  258. long    insert_artptr;                /* Article to insert to     */
  259. long    insert_regptr;                /* Region to insert after   */
  260.  
  261. int      reopen_prim;                /* flag if reopen_region()  */
  262. long    daveptr;                /* daves's 4800 xxx buffer  */
  263.  
  264. /**************************************************************************/
  265. /* Function:    do_view_size()                          */
  266. /* Description: Handler for menu to switch scales - Actual size etc..      */
  267. /*        checks the chosen item.                      */
  268. /*        Institutes a redraw of the preview window.          */
  269. /* IN:  item  - menu item                          */
  270. /* OUT: none                                   */
  271. /* GLOBAL: page_area  - resets GRECT for the MFDB              */
  272. /**************************************************************************/
  273. do_view_size(item)
  274. int item;
  275. {
  276.    register int i;
  277.    int prev_item;
  278.    int titem;
  279.  
  280.  
  281.       
  282.    prev_item = view_size;
  283.    if(view_size != item)
  284.    {
  285.       view_size = item;
  286.       for(i=PSIZE;i<= PADJCNT;i++)
  287.          menu_icheck(ad_menu,i,FALSE);
  288.       menu_icheck(ad_menu,item,TRUE);
  289.     
  290.       if((item == PADJCNT) || (prev_size == PADJCNT))
  291.                     recalc_alt_text();
  292.       
  293.       prev_item = item;
  294.       if(view_size != PADJCNT)
  295.      titem = item;
  296.       else
  297.       {
  298.         titem = ((curr_page % 2) ? (item + 1) : (item));        
  299.       }
  300.  
  301.       wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);
  302.       wind_set(prev_handle,WF_TOP,&dummy,&dummy,&dummy,&dummy);
  303.       page_area.g_x = page_area.g_y = 0L;
  304.       active_prim = 0;    /* reset primitives */
  305.  
  306.       gsx_moff();
  307.       vsf_interior(shandle,0);            /* Set to Solid   */
  308.  
  309.       if( (view_size == PSIZE) ||
  310.       (view_size == PADJCNT))
  311.          pdraw_fit(view_size);
  312.       else
  313.          pdraw_scale();
  314.  
  315.  
  316.       prev_size = view_size;
  317.       zoom_setup();
  318.       cur_scale = get_scale_num(view_size);
  319.       get_work(prev_handle);
  320.       update_preview_blit();
  321.       set_clip(TRUE,&pwork);
  322.       vr_recfl(shandle,pxy);
  323.       clear_window(prev_handle,2,1);
  324.       init_rulers();
  325.       force_preview();
  326.       slider_chk();
  327.       set_clip(TRUE,&dpwork);
  328.       gsx_mon();
  329.    }
  330. }
  331.  
  332.  
  333.  
  334.  
  335. /**************************************************************************/
  336. /* Function: genesis_region()                          */
  337. /* Description: Creates a NEW region                      */
  338. /*         Disables close region.                      */
  339. /*        enables the drawing primitives.                  */
  340. /**************************************************************************/
  341. genesis_region()
  342. {
  343.      register int i;
  344.      long msize;
  345.  
  346.      if( (msize = Malloc(-1L)) <= MINSIZE)     
  347.      {
  348.         alert_cntre(ALERT23);
  349.         return;
  350.      }
  351.  
  352.      menu_ienable(ad_menu,RCREATE,FALSE);
  353.      menu_ienable(ad_menu,ROPENGR,FALSE);
  354.      menu_ienable(ad_menu,RCLOSE,TRUE);
  355.      menu_ienable(ad_menu,RTOGGLE,FALSE);
  356.      menu_ienable(ad_menu,OADDPRIM,FALSE);
  357.      menu_ienable(ad_menu,OPCOORD,FALSE);
  358.      menu_ienable(ad_menu,OMOVEFNT,FALSE);
  359.      menu_ienable(ad_menu,OMOVEBAK,FALSE);
  360.      menu_ienable(ad_menu,ODELPRIM,FALSE);     
  361.      menu_ienable(ad_menu,RCOORD,FALSE);
  362.      menu_ienable(ad_menu,RMOVEFNT,FALSE);
  363.      menu_ienable(ad_menu,RMOVEBAK,FALSE);
  364.      active_prim =FALSE;
  365.      prim_ptr = 0L;      
  366.      
  367.      for(i=OPOLYGON;i<=OBOX;i++)
  368.                  menu_ienable(ad_menu,i,TRUE);
  369.      check_region_ptr();
  370.      gl_region_ptr = create_region(curr_page,FALSE);     
  371. /*     init_tattr();    Remove? This would setup each region with its
  372.             Defaults. Not what is in the font dialog box */
  373.      funcs = &box_draw;
  374.      put_txtattr(gl_region_ptr,&gltxtattr);     /* and store in region   */
  375.      check_top_window();     
  376.      graf_mouse(OUTLN_CROSS,&dummy);
  377. }
  378.  
  379.  
  380.  
  381.  
  382. /**************************************************************************/
  383. /* Function: graphic_region()                          */
  384. /* Description: Creates a NEW graphic region                  */
  385. /*         Disables close region.                      */
  386. /*        enables the drawing primitives.                  */
  387. /**************************************************************************/
  388. graphic_region()
  389. {
  390.      register int i;
  391.      long msize;
  392.  
  393.      if( (msize = Malloc(-1L)) <= MINSIZE  )     
  394.      {
  395.         alert_cntre(ALERT23);
  396.         return;
  397.      }
  398.  
  399.      change_icstate(NORMAL,ICBOX1,1);
  400.      menu_ienable(ad_menu,RCREATE,FALSE);
  401.      menu_ienable(ad_menu,ROPENGR,FALSE);
  402.      menu_ienable(ad_menu,RCLOSE,TRUE);
  403.      menu_ienable(ad_menu,RTOGGLE,FALSE);
  404.      menu_ienable(ad_menu,OADDPRIM,FALSE);
  405.      menu_ienable(ad_menu,OPCOORD,FALSE);
  406.      menu_ienable(ad_menu,OMOVEFNT,FALSE);
  407.      menu_ienable(ad_menu,OMOVEBAK,FALSE);
  408.      menu_ienable(ad_menu,ODELPRIM,FALSE);     
  409.      menu_ienable(ad_menu,RCOORD,FALSE);
  410.      menu_ienable(ad_menu,RMOVEFNT,FALSE);
  411.      menu_ienable(ad_menu,RMOVEBAK,FALSE);
  412.      active_prim = FALSE;     
  413.      prim_ptr = 0L;
  414.  
  415.      for(i=OPOLYGON;i<=OIMAGE;i++)
  416.                  menu_ienable(ad_menu,i,TRUE);
  417.  
  418.      write_flag = TRUE;
  419.      menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  420.      check_region_ptr();
  421.      gl_grregion_ptr = create_region(curr_page,TRUE);
  422.      graph_flag = TRUE;
  423.  
  424.      glgrattr[0] = gl_lstyle;
  425.      glgrattr[1] = gl_lwidth;
  426.      glgrattr[2] = gl_fstyle;
  427.      glgrattr[3] = gl_findex;
  428.      glgrattr[4] = gl_repel;
  429.      glgrattr[5] = gl_repoffset;
  430.      glgrattr[6] = gl_repbounds;
  431.      glgrattr[7] = glgrattr[8] = 0;
  432.      put_grattr(gl_grregion_ptr,glgrattr);     /* and store in region   */
  433.      funcs = &box_draw;
  434.      check_top_window();
  435.      graf_mouse(OUTLN_CROSS,&dummy);
  436. }
  437.  
  438.  
  439.  
  440.  
  441. /**************************************************************************/
  442. /* Function: close_region()                          */
  443. /* Description: Closes a region                          */
  444. /* IN: none                                  */
  445. /* OUT: none                                  */
  446. /* GLOBAL:   funcs - current drawing function set to null          */
  447. /*         Disables close_region/enables create region          */
  448. /*         Disables drawing primitives.                  */
  449. /**************************************************************************/
  450. close_region()
  451. {
  452.    int grtype;
  453.    long tmpreg;
  454.    register int i;
  455.    int x,y;
  456.    int opcode,count,wmode;
  457.  
  458.    tmpreg = get_curreg(&grtype);
  459.  
  460.    if(reopen_prim)
  461.    {
  462.     reopen_prim = FALSE;
  463.     page_redraw(tmpreg);
  464.     open_region(tmpreg);
  465.     
  466.    }
  467.  
  468.    if(grtype)
  469.    {
  470.     gl_grregion_ptr = tmpreg;
  471.     update_repel(1,0L);
  472.         gl_grregion_ptr = 0L;
  473.    }
  474.    if(!mode_flag)    /* Don't enable if we're displaying text */
  475.        menu_ienable(ad_menu,RCREATE,TRUE);
  476.  
  477.    menu_ienable(ad_menu,ROPENGR,TRUE);
  478.    menu_ienable(ad_menu,RCLOSE,FALSE);
  479.    menu_ienable(ad_menu,RTOGGLE,TRUE);
  480.    menu_ienable(ad_menu,RWRITE,TRUE);
  481.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  482.    active_prim = FALSE;
  483.  
  484.    for(i=OPOLYGON;i<=OIMAGE;i++)
  485.                 menu_ienable(ad_menu,i,FALSE);     
  486.    funcs = &nada;
  487.    gl_region_ptr = gl_grregion_ptr = region_ptr = 0L;
  488.    if(multi_mode)
  489.    {
  490.       clr_multi_flags(curr_page);
  491.       multi_mode = 0;
  492.    }
  493.    graph_flag = cur_primitive = FALSE;
  494.  
  495.    if(!article_flag)
  496.    {
  497.      write_flag = 1;
  498. /*      image_status = FALSE;*/
  499.      menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]);
  500.      menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  501. /*     menu_icheck(ad_menu,RDIMAGES,FALSE);*/
  502.      menu_ienable(ad_menu,ACREATE,TRUE);
  503.      graf_mouse(ARROW,&dummy);
  504.    }
  505.    rmenu_fix(0);
  506.  
  507.    if(bgicptr->bi_pdata == primicons)
  508.    {
  509.        bgicptr->bi_pdata = icdata;
  510.        objc_offset(ad_bkgrnd,BGICBOX,&x,&y);
  511.        ad_bkgrnd[ICBOX6].ob_state = NORMAL;
  512.        ad_bkgrnd[ICBOX7].ob_state = NORMAL;
  513.        ad_bkgrnd[ICBOX8].ob_state = NORMAL;
  514.        clr_bgicons(0);
  515.        if(mode_flag)
  516.        {
  517.         change_icstate(DISABLED,ICBOX1,0);
  518.         change_icstate(SELECTED,ICBOX3,0);
  519.        }
  520.        if(image_status)
  521.         change_icstate(SELECTED,ICBOX4,0);
  522.        if(show_grids)
  523.         change_icstate(SELECTED,ICBOX7,0);
  524.        if(snap_to_grids)
  525.         change_icstate(SELECTED,ICBOX8,0);
  526.        form_dial(3,0,0,0,0,x,y,
  527.         ad_bkgrnd[BGICBOX].ob_width,
  528.         ad_bkgrnd[BGICBOX].ob_height);
  529.    }
  530.    opcode = get_fprimitive(tmpreg,&count,&wmode);
  531.    if(opcode == -1 || !count)        /* If empty region */
  532.     delete_region(tmpreg);   
  533. }
  534.  
  535.  
  536.  
  537.  
  538.  
  539. /**************************************************************************/
  540. /* Function: draw_items()                          */
  541. /* Description: Draws objects into the region                  */
  542. /*        Selects the function to draw with.              */
  543. /* IN:      item  - menu item selected.                      */
  544. /* GLOBAL:  funcs - function points to function to draw with.          */
  545. /**************************************************************************/
  546. draw_items(item)
  547. int item;
  548. {
  549.     cur_primitive = item;
  550.     switch(item)
  551.     {
  552.        case OPOLYGON:   funcs = &poly_draw;
  553.             break;
  554.     
  555.        case OCIRCLE:    funcs = &circle_draw;
  556.             break;
  557.  
  558.        case OELLIPSE:   funcs = &ellipse_draw;
  559.             break;
  560.  
  561.        case OBOX:    funcs = &box_draw;
  562.             break;
  563.  
  564.        case OLINE:    funcs = &poly_draw;
  565.             break;
  566.  
  567.        case ORBOX:      funcs = &box_draw;
  568.             break;
  569.  
  570.        case OIMAGE:     funcs = &box_draw;
  571.             if(!get_image())
  572.                 return;
  573.             break;
  574.     }
  575.     graf_mouse(OUTLN_CROSS,&dummy);
  576.     evnt_button(1,1,0,&dummy,&dummy,&dummy,&dummy);
  577. }
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586. /**************************************************************************/
  587. /* Function: erase_all()                          */
  588. /* Description: Deletes all regions in data structure              */
  589. /*        Unless the Alert Box button == CANCEL              */
  590. /*        Deletes all pages                       */
  591. /*        Deletes all articles                      */
  592. /**************************************************************************/
  593. erase_all(flag)
  594. int flag;        /* Clean up more stuff if not quitting          */
  595. {
  596.      int dummy;
  597.      long art;
  598.  
  599.      if(tmplate_flag && flag)
  600.      {
  601.        pagehd = tpagehd;
  602.        curpage = tcurpage;
  603.        arthd   = tarthd;
  604.        tmplate_flag = FALSE;
  605.        wind_set(prev_handle,WF_NAME,"Preview Window",0,0);
  606.        menu_text(ad_menu,OEDITTMP,template_mode[tmplate_flag]);
  607.        menu_ienable(ad_menu,OERASETP,FALSE);
  608.        menu_ienable(ad_menu,PGOTO,TRUE);
  609.        menu_ienable(ad_menu,PDELETE,TRUE);
  610.        menu_ienable(ad_menu,PINSERT,TRUE);
  611.      }
  612.  
  613.      clear_tags();
  614.      get_fpage(&dummy);
  615.      while(delete_page());
  616.      art = getf_article();
  617.      while(delete_article());
  618.      if(flag)
  619.      {
  620.         IF_close();
  621.     IF_open(0);            /* Free cache memory */
  622.         gl_grregion_ptr = gl_region_ptr = 0L;
  623.         multi_mode = 0;
  624.         temp_page = curr_page = 1;
  625.         page_area.g_x = page_area.g_y = 0L;
  626.         slider_chk();     
  627.         force_preview();
  628.         do_pagenum(curr_page,(curr_page%2)?1:0);
  629.      }
  630. }
  631.  
  632.  
  633.  
  634.  
  635. /**************************************************************************/
  636. /* Function:    do_flip_page()                          */
  637. /* Description: Handles Previous and Next Page Menu Calls          */
  638. /**************************************************************************/
  639. do_flip_page(item)
  640. int item;
  641. {
  642.      register int tmp;
  643.      int titem;
  644.      int flag;
  645.  
  646.      tmp = curr_page;
  647.      titem = view_size;
  648.  
  649.      tmp = ((item == PPREV) ? (--tmp) :(++tmp));
  650.      if(tmplate_flag)
  651.      {
  652.        if(tmp < -2) tmp = -2;
  653.        if(tmp > -1) tmp = -1;
  654.  
  655.        if(tmp == -2)
  656.        {       
  657.       curpage = pagehd = left_tmplate;
  658.       rtarthd = arthd;    /* cjg */      
  659.       arthd   = ltarthd;
  660.        }
  661.        else
  662.        {
  663.       curpage = pagehd = right_tmplate;
  664.       ltarthd = arthd;    /* cjg */
  665.       arthd   = rtarthd;
  666.        }
  667.      }
  668.      else
  669.      {
  670.        if(tmp < 0) tmp = 0;
  671.        if(tmp > 999) tmp = 999;
  672.      }
  673.      curr_page = tmp;
  674.  
  675.      set_int(ad_go_page,GOTOPAGE,curr_page);
  676.      flag = TRUE;
  677.  
  678.      if(view_size == PADJCNT)
  679.      {
  680.         titem = ((curr_page % 2) ? (titem + 1) : (titem));
  681.         wind_set(prev_handle,WF_INFO,winfo[titem - PSIZE][unit_type]);        
  682.  
  683.         if(item == PPREV)
  684.        flag = (( !(curr_page % 2)) ? (FALSE):(TRUE));
  685.         else
  686.        flag = ((curr_page % 2) ? (FALSE):(TRUE));
  687.      }
  688.  
  689.      if(flag)     
  690.      {
  691.          mode_change = TRUE;
  692.          force_preview();
  693.      }
  694.      else
  695.      do_blit();
  696. }
  697.  
  698.  
  699. /**************************************************************************/
  700. /* Function:    make_article()                          */
  701. /* Description: Creates Article                          */
  702. /**************************************************************************/
  703. make_article()
  704. {
  705.    long msize;
  706.    int dummy;
  707.    int button;
  708.    int x,y,w,h;
  709.    long num;
  710.  
  711.    if( (msize = Malloc(-1L)) <= MINSIZE)     
  712.    {
  713.         alert_cntre(ALERT23);
  714.         return;
  715.    }
  716.  
  717.    strcpy(pathbuf,dpath1);
  718.    strcat(pathbuf,"*.TXT");
  719.    if(!get_fs(fbuffer,&dummy))
  720.    {
  721.     graf_mouse(ARROW,&dummy);
  722.     return;
  723.    }
  724.    extender(fbuffer,".TXT");
  725.    Fsetdta(&thedta.res[0]);
  726.    if(Fsfirst(fbuffer,0) <= -1)
  727.    {
  728. /*        if((alert_cntre(ALERT24)==1))*/
  729.  
  730.     set_int(ad_filebuf,FBUFSIZE,10);
  731.  
  732.         form_center(ad_filebuf,&x,&y,&w,&h);
  733.         form_dial(0,0,0,36,36,x,y,w,h);
  734.         objc_draw(ad_filebuf,0,MAX_DEPTH,x,y,w,h);
  735.    err:
  736.         button = form_do(ad_filebuf,FBUFSIZE);
  737.         ad_filebuf[button].ob_state = NORMAL;
  738.         if(button == FBUFOK)
  739.         {
  740.        num = get_int(ad_filebuf,FBUFSIZE);
  741.        if(num < 10)
  742.            {
  743.                 objc_draw(ad_filebuf,FBUFOK,MAX_DEPTH,x,y,w,h);
  744.         goto err;
  745.            }
  746.            form_dial(3,0,0,3,36,x,y,w,h);    
  747.        num *= 1024L;
  748.            if( (msize = Malloc(-1L)) <= num)     
  749.            {
  750.         alert_cntre(ALERT23);
  751.             graf_mouse(ARROW,&dummy);    /* Abort    */
  752.         return;
  753.            }
  754.        ed_new_article(num);        /* Create new file with editor */
  755.         }
  756.     else
  757.     {
  758.        graf_mouse(ARROW,&dummy);    /* Abort    */
  759.        form_dial(3,0,0,3,36,x,y,w,h);
  760.        return;
  761.     }
  762.    }
  763.    else
  764.     loadfile(fbuffer);
  765.    amenu_fix(1);
  766.    graf_mouse(2,&dummy);
  767.    create_article();
  768.    remove_path(fbuffer);
  769.    update_article(fbuffer);
  770.    graf_mouse(ARROW,&dummy);
  771.    art_append = TRUE;
  772.    menu_ienable(ad_menu,ASAVEART,FALSE);
  773.    menu_ienable(ad_menu,AAUTOFL,TRUE);
  774.    menu_ienable(ad_menu,ACLOSE,TRUE);
  775.    menu_ienable(ad_menu,ACREATE,FALSE);
  776.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  777.    graf_mouse(255,mlink);
  778.    article_flag = TRUE;
  779.    check_top_window();
  780. }
  781.  
  782.  
  783.  
  784. /**********************************************************************/
  785. /* Function: ed_new_article()                          */
  786. /* Description: Setup buffers to edit a new article              */
  787. /**********************************************************************/
  788. ed_new_article(msize)
  789. long msize;
  790. {
  791.    long chbuff;
  792.  
  793.    if(chbuff = lcalloc(1L,msize))    /* Allocate initial buffer */
  794.    {
  795.      init_buffer(chbuff,chbuff+msize);
  796.      set_buffer(0L);
  797.      return(1);
  798.    }
  799.    return(0);
  800. }
  801.  
  802.  
  803. /**************************************************************************/
  804. /* Function:    close_article()                          */
  805. /* Description: Closes Article                          */
  806. /**************************************************************************/
  807. close_article()
  808. {
  809.    menu_ienable(ad_menu,ASAVEART,TRUE);
  810.    menu_ienable(ad_menu,AAUTOFL,FALSE);
  811.    menu_ienable(ad_menu,ACREATE,TRUE);
  812.    menu_ienable(ad_menu,ACLOSE,FALSE);
  813.    graf_mouse(2,&dummy);
  814.    if(tmplate_flag)
  815.    {
  816.      if(curr_page == -2)
  817.     ltarthd = arthd;
  818.      else
  819.     rtarthd = arthd;
  820.    }
  821.  
  822.    article_flag = FALSE;
  823.    do_update_text();
  824.    if(mode_flag)
  825.     force_preview();
  826.    graf_mouse(0,&dummy);
  827.    amenu_fix(0);
  828.    region_ptr = gl_region_ptr = gl_grregion_ptr = 0L;
  829. }
  830.  
  831.  
  832.  
  833.  
  834. /**************************************************************************/
  835. /* Function:    do_hot_link()                          */
  836. /* Description: Link regions togethor for articles              */
  837. /**************************************************************************/
  838. do_hot_link(mx,my)
  839. int mx,my;
  840. {
  841.    int nmx,nmy;
  842.    int g_flag;
  843.    int tpage;
  844.    int dummy;
  845.  
  846.    tpage = curr_page;
  847.    scrntomu(mx,my,&nmx,&nmy,0);
  848.    if(view_size == PADJCNT)
  849.    {
  850.     if(alt_offset)
  851.     {
  852.          if(!(curr_page % 2))
  853.             curr_page++;
  854.         }
  855.     else
  856.     {
  857.            if( curr_page % 2)
  858.             curr_page--;
  859.     }
  860.    }
  861.  
  862.    region_ptr = find_region(nmx,nmy,curr_page,
  863.         &dummy,&dummy,&dummy,&dummy,&g_flag);
  864.    if(region_ptr)
  865.    {
  866.      if(get_regart(region_ptr))
  867.      {
  868.     alert_cntre(ALERT5);
  869.     return;
  870.      }
  871.      if((region_ptr != 0x0L) && !g_flag)
  872.      {
  873.     if(art_append)
  874.        add_to_article(region_ptr);
  875.     else
  876.        insert_to_article(insert_artptr,insert_regptr,region_ptr);
  877.     if(mode_flag)
  878.     {
  879.        mlink1[3] = 0;
  880.        mlink1[4] = 1;
  881.     }
  882.     else
  883.     {
  884.        mlink1[3] = 1;
  885.        mlink1[4] = 0;
  886.     }
  887.        graf_mouse(255,mlink1);
  888.      }
  889.    }
  890.    curr_page = tpage;
  891.    
  892.    graf_mkstate(&nmx,&nmy,&dummy,&dummy);
  893.    evnt_mouse(1,nmx - 4,nmy - 4,8,8,&dummy,&dummy,&dummy,&dummy);
  894.    graf_mouse(255,mlink);
  895.    BSTATE = 0;
  896. }
  897.  
  898.  
  899.  
  900.  
  901. /**************************************************************************/
  902. /* Function:    check_top_window                      */
  903. /* Description: checks if preview window is on top, and forces it to be   */
  904. /**************************************************************************/
  905. check_top_window()
  906. {
  907.    int thandle;
  908.  
  909.      wind_get(0,WF_TOP,&thandle,&dummy,&dummy,&dummy);
  910.      if(thandle != prev_handle)
  911.            wind_set(prev_handle,WF_TOP,0,0,0,0);
  912. }
  913.  
  914.  
  915.  
  916. /**************************************************************************/
  917. /* Function:    display_toggle()                      */
  918. /* Description:                               */
  919. /**************************************************************************/
  920. display_toggle()
  921. {
  922.     int x,y;
  923.  
  924.         menu_ienable(ad_menu,RCREATE,mode_flag);
  925.     menu_ienable(ad_menu,RWRITE,mode_flag);
  926.     menu_ienable(ad_menu,ADEFER,mode_flag);
  927.     mode_flag ^= TRUE;
  928.     if(mode_flag && deferhj)
  929.     {
  930.        deferhj = 0;
  931.        menu_icheck(ad_menu,ADEFER,0);
  932.        recalc_txtptrs();
  933.     }
  934.     if(mode_flag)
  935.     {
  936.         ad_bkgrnd[ICBOX1].ob_state = DISABLED;
  937.         menu_ienable(ad_menu,OADDPRIM,FALSE);
  938.     }
  939.     else
  940.     {
  941.         ad_bkgrnd[ICBOX1].ob_state = NORMAL;
  942.     }
  943.     objc_offset(ad_bkgrnd,ICBOX1,&x,&y);
  944.     form_dial(3,0,0,0,0,x,y,
  945.             ad_bkgrnd[ICBOX1].ob_width,
  946.             2*ad_bkgrnd[ICBOX1].ob_height);
  947.  
  948.     menu_text(ad_menu,RTOGGLE,mode_text[mode_flag]);
  949.     mode_change = TRUE;
  950.     send_redraw(prev_handle);
  951. }
  952.  
  953.  
  954.  
  955. /**************************************************************************/
  956. /* Function:    do_artdelete()                          */
  957. /* Description:  Delete the selected article.                  */
  958. /**************************************************************************/    
  959.  
  960. do_artdelete()
  961. {
  962. long artptr;
  963.  
  964.    artptr = do_artobj();
  965.    if(artptr)
  966.    {
  967.     open_article(artptr);
  968.     delete_article();
  969.     force_draw_flag = 1;
  970.     force_preview();
  971.    }
  972. }
  973.  
  974.  
  975.  
  976. /**************************************************************************/
  977. /* Function:    do_artopen()                          */
  978. /* Description:  Open the selected article and link regions to it.      */
  979. /**************************************************************************/
  980. do_artopen()
  981. {
  982. int dolink;
  983. long artptr;
  984.    
  985.    dolink = 0;
  986.    if(gl_region_ptr)
  987.    {
  988.     if((insert_artptr = get_regart(gl_region_ptr)))
  989.     {
  990.          open_article(insert_artptr);
  991.        insert_regptr = gl_region_ptr;
  992.        art_append = FALSE;
  993.        dolink = TRUE;
  994.        }
  995.    }
  996.    else
  997.    {
  998.     artptr = do_artobj();
  999.     if(artptr)
  1000.     {
  1001.        open_article(artptr);
  1002.        dolink = TRUE;
  1003.        art_append = TRUE;
  1004.     }
  1005.    }
  1006.    if(dolink)
  1007.    {
  1008.        amenu_fix(1);
  1009.        menu_ienable(ad_menu,ASAVEART,FALSE);
  1010.        menu_ienable(ad_menu,ACLOSE,TRUE);
  1011.        menu_ienable(ad_menu,ACREATE,FALSE);
  1012.        graf_mouse(255,mlink);
  1013.        article_flag = TRUE;
  1014.    }
  1015. }
  1016.  
  1017. do_saveart()
  1018. {
  1019. long artptr;
  1020.  
  1021.    artptr = do_artobj();
  1022.    if(artptr)
  1023.    {
  1024.     save_article(artptr);
  1025.    }
  1026. }
  1027.  
  1028.  
  1029.  
  1030.  
  1031. /**************************************************************************/
  1032. /*     Handle autoflow of regions into the article              */
  1033. /**************************************************************************/
  1034. do_autoflow()
  1035. {
  1036. int minpage,maxpage;
  1037. int page;
  1038. register long pptr,rptr;
  1039. int gflag;
  1040. int x;
  1041.  
  1042.    if(!get_range(&minpage,&maxpage))
  1043.     return;
  1044.    pptr = get_fpage(&page);
  1045.    if(!pptr)
  1046.     return;
  1047.    while(pptr)
  1048.    {
  1049.     if(page >= minpage && page <= maxpage)
  1050.     {
  1051.        rptr = get_fregion(page,&x,&x,&x,&x,&gflag);
  1052.            while(rptr)
  1053.        {
  1054.          if((!get_regart(rptr)) && (!gflag))
  1055.         {
  1056.                add_to_article(rptr);
  1057.         }
  1058.             rptr = get_nregion(&x,&x,&x,&x,&gflag);
  1059.        }
  1060.      }
  1061.         pptr = get_npage(&page);
  1062.    }
  1063.    close_article();
  1064. }
  1065.  
  1066.  
  1067. /**************************************************************************/
  1068. /*  Function: reopen_region()                          */
  1069. /*  Description: opens an existing region for adding more primitives      */
  1070. /**************************************************************************/
  1071. reopen_region()
  1072. {
  1073.     int type;
  1074.     register int i;
  1075.     int j;
  1076.     unsigned long tregion;
  1077.  
  1078.     tregion = get_curreg(&type);
  1079.     menu_ienable(ad_menu,RCLOSE,TRUE);
  1080.     menu_ienable(ad_menu,RCREATE,FALSE);
  1081.     menu_ienable(ad_menu,OADDPRIM,FALSE);
  1082.     menu_ienable(ad_menu,RTOGGLE,FALSE);
  1083.     menu_ienable(ad_menu,ROPENGR,FALSE);
  1084.     write_flag = TRUE;
  1085.  
  1086.     menu_text(ad_menu,RWRITE,write_mode[write_flag]);
  1087.  
  1088.     if(type)
  1089.     {
  1090.     graph_flag = TRUE;
  1091.         j = OIMAGE;
  1092.     }
  1093.     else
  1094.     j = OBOX;
  1095.     for(i=OPOLYGON;i<=j;i++)
  1096.         menu_ienable(ad_menu,i,TRUE);
  1097.     check_top_window();
  1098.     reopen_prim = TRUE;
  1099.     funcs = &box_draw;
  1100.     graf_mouse(OUTLN_CROSS,&dummy);
  1101. }
  1102.  
  1103.  
  1104.  
  1105.  
  1106.  
  1107. /**************************************************************************/
  1108. /*  Function: del_prim()                          */
  1109. /*  Description: Delete the current active primitive              */
  1110. /**************************************************************************/
  1111. del_prim()
  1112. {
  1113.      unsigned long tregion;
  1114.      int oldrect[4];
  1115.      int dummy;
  1116.      REGION *tptr;
  1117.      int type;
  1118.  
  1119.      if(!region_ptr)            /* Well, if no active region...*/
  1120.      {                    /* how can we have an active   */
  1121.       clear_regprim_flags();    /* primitive?...:-)           */
  1122.       return;
  1123.      }
  1124.  
  1125.      if((alert_cntre(ALERT40) == 1))
  1126.      {
  1127.        find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2],
  1128.             &oldrect[3],&type,&dummy);
  1129.        delete_primitive();
  1130.        menu_ienable(ad_menu,ODELPRIM,FALSE);
  1131.        menu_ienable(ad_menu,OPCOORD,FALSE);
  1132.        menu_ienable(ad_menu,OMOVEFNT,FALSE);
  1133.        menu_ienable(ad_menu,OMOVEBAK,FALSE);
  1134.        active_prim = FALSE;
  1135.        tptr = tregion = region_ptr;
  1136.        open_region(tregion);
  1137.        recalc_region();
  1138.        if(tptr->primlist == 0L)    /* if last primitive, delete region also */
  1139.        {
  1140.       tregion = 0L;
  1141.       do_delregion();
  1142.       clear_regprim_flags();
  1143.       return;
  1144.        }
  1145.        
  1146.        if(!type)
  1147.        {        
  1148.        page_redraw(region_ptr);
  1149.            redraw_area(region_ptr,oldrect,1);   /* Cleanup old area */        
  1150.        }
  1151.        else
  1152.          update_repel(1,oldrect);
  1153.  
  1154.    
  1155.        region_ptr = tregion;
  1156.        if(region_ptr)
  1157.                router_selected();
  1158.     }
  1159. }
  1160.  
  1161.  
  1162.  
  1163. /**************************************************************************/
  1164. /* Function: router_selected()                          */
  1165. /* Description: Draws outline on current active region              */
  1166. /**************************************************************************/
  1167. router_selected()
  1168. {
  1169.      int page;
  1170.      int minx,miny,maxx,maxy;
  1171.      int type;
  1172.  
  1173.      find_boundary(region_ptr,&minx,&miny,&maxx,&maxy,&type,&page);
  1174.      outline_primman(minx,miny,maxx,maxy,type,page);
  1175. }
  1176.  
  1177.  
  1178.  
  1179.  
  1180.  
  1181. /**************************************************************************/
  1182. /* Function: post_edit_prim()                          */
  1183. /* Description: Conclusion of prim editing functions              */
  1184. /**************************************************************************/
  1185. post_edit_prim(opcode,pcount,wmode,prim_ptr)
  1186. int opcode;
  1187. int pcount;
  1188. int wmode;
  1189. long prim_ptr;
  1190. {
  1191.      unsigned long tregion_ptr;
  1192.      int mx,my,mbutton;
  1193.      int minx,miny,maxx,maxy;
  1194.      int type;
  1195.      int page;
  1196.      int oldrect[4];
  1197.      int dummy;
  1198.  
  1199.      find_boundary(region_ptr,&oldrect[0],&oldrect[1],&oldrect[2],
  1200.             &oldrect[3],&dummy,&dummy);
  1201.      update_primitive(opcode,pcount,wmode,0);
  1202.      recalc_region();
  1203.  
  1204.      tregion_ptr = region_ptr;
  1205.      graf_mkstate(&mx,&my,&mbutton,&dummy);
  1206.      if(gl_region_ptr)
  1207.      {
  1208.         if(view_size != PADJCNT)
  1209.     {
  1210.            tregion_ptr = region_ptr;
  1211.            redraw_area(region_ptr,oldrect,1);   /* Cleanup old area */        
  1212.        region_ptr = gl_region_ptr = tregion_ptr;        
  1213.     }
  1214.     page_redraw(gl_region_ptr);
  1215.     gl_region_ptr = tregion_ptr;
  1216.      }
  1217.      else
  1218.      {
  1219.         update_repel(1,oldrect);
  1220.     gl_grregion_ptr = tregion_ptr;
  1221.      }
  1222.      region_ptr = tregion_ptr;
  1223.      active_prim = TRUE;
  1224.      open_region(region_ptr);
  1225.      set_cur_prim(prim_ptr);
  1226.      calc_prim(opcode,&minx,&miny,&maxx,&maxy,pcount);
  1227.      find_page(region_ptr,&page);
  1228.      region_ptr = get_curreg(&type);
  1229.      outline_primman(minx,miny,maxx,maxy,type,page);
  1230. }
  1231.  
  1232.  
  1233.  
  1234.  
  1235. /**************************************************************************/
  1236. /* Function: outline_primman()                          */
  1237. /* Description: Draws outline arnd active primitive              */
  1238. /*        Works in unison with post_edit_prim()              */
  1239. /**************************************************************************/
  1240. outline_primman(minx,miny,maxx,maxy,type,page)
  1241. int minx,miny,maxx,maxy;
  1242. int type,page;
  1243. {
  1244.      if(type)
  1245.     gl_grregion_ptr = region_ptr;
  1246.      else
  1247.     gl_region_ptr = region_ptr;
  1248.  
  1249.      if((page % 2) && (view_size == PADJCNT))
  1250.      {
  1251.     alt_offset = TRUE;
  1252.     minx += hpage_size;
  1253.     maxx += hpage_size;
  1254.      }
  1255.      mutoscrn(minx,miny,&pxy[0],&pxy[1],0);
  1256.      mutoscrn(maxx,maxy,&pxy[2],&pxy[3],0);
  1257.      gsx_moff();
  1258.      do_outline(xor_handle,pxy);
  1259.      gsx_mon();
  1260. }
  1261.  
  1262.  
  1263.  
  1264. region_front()
  1265. {
  1266.  
  1267.    if(!region_ptr)            /* if none selected, return */
  1268.    {
  1269.       clear_regprim_flags();   
  1270.       return;            /* Just in case          */
  1271.    }
  1272.    do_reg_front(region_ptr);
  1273.    redr_regarea(region_ptr,1);
  1274.    clear_regprim_flags();   
  1275. }
  1276.  
  1277.  
  1278.  
  1279.  
  1280. region_back()
  1281. {
  1282.    if(!region_ptr)            /* if none selected, return */
  1283.    {
  1284.       clear_regprim_flags();
  1285.       return;            /* Just in case          */
  1286.    }
  1287.    do_reg_back(region_ptr);   
  1288.    redr_regarea(region_ptr,1);
  1289.    clear_regprim_flags();
  1290. }
  1291.  
  1292.  
  1293.  
  1294.  
  1295. prim_front()
  1296. {
  1297.    unsigned long pptr;
  1298.    int wrmode;
  1299.    int count;
  1300.  
  1301.  
  1302.    if(!region_ptr)            /* if none selected, return */
  1303.    {
  1304.       clear_regprim_flags();
  1305.       return;            /* Just in case          */
  1306.    }
  1307.    get_cur_prim(&count,&wrmode,&pptr);
  1308.    if(!pptr)
  1309.    {
  1310.        clear_regprim_flags();   
  1311.        return;
  1312.    }
  1313.    do_prim_front(pptr);
  1314.    redr_regarea(region_ptr,1);
  1315.    clear_regprim_flags();
  1316. }
  1317.  
  1318.  
  1319.  
  1320. prim_back()
  1321. {
  1322.    unsigned long pptr;
  1323.    int wrmode;
  1324.    int count;
  1325.  
  1326.  
  1327.    if(!region_ptr)            /* if none selected, return */
  1328.    {
  1329.       clear_regprim_flags();
  1330.       return;            /* Just in case          */
  1331.    }
  1332.    get_cur_prim(&count,&wrmode,&pptr);
  1333.    if(!pptr)
  1334.    {
  1335.         clear_regprim_flags();   
  1336.     return;
  1337.    }
  1338.    do_prim_back(pptr);
  1339.    redr_regarea(region_ptr,1);
  1340.    clear_regprim_flags();
  1341. }
  1342.  
  1343.  
  1344.  
  1345.  
  1346. clear_regprim_flags()
  1347. {
  1348.    curregion = prim_ptr = gl_grregion_ptr = gl_region_ptr = region_ptr = 0L;
  1349.    if(multi_mode)
  1350.    {
  1351.       clr_multi_flags(curr_page);
  1352.       multi_mode = 0;
  1353.    }
  1354.    active_prim = FALSE;
  1355.    
  1356.    menu_ienable(ad_menu,OADDPRIM,FALSE);
  1357.    menu_ienable(ad_menu,ODELPRIM,FALSE);
  1358.    menu_ienable(ad_menu,OPCOORD,FALSE);
  1359.    menu_ienable(ad_menu,OMOVEFNT,FALSE);
  1360.    menu_ienable(ad_menu,OMOVEBAK,FALSE);
  1361.  
  1362.    menu_ienable(ad_menu,RUNLINK,FALSE);
  1363.    menu_ienable(ad_menu,RDELETE,FALSE);
  1364.    menu_ienable(ad_menu,RCOORD,FALSE);
  1365.    menu_ienable(ad_menu,RMOVEFNT,FALSE);
  1366.    menu_ienable(ad_menu,RMOVEBAK,FALSE);
  1367. }
  1368.  
  1369.  
  1370. recalc_alt_text()
  1371. {
  1372.    PAGE    *rpagehd;
  1373.    PAGE    *rcurpage;
  1374.    int     rcurr_page;
  1375.    ARTICLE *rarthd;
  1376.  
  1377.    recalc_txtptrs();        /* recalc current page */
  1378.  
  1379.    rpagehd    = pagehd;        /* save the settings   */
  1380.    rcurpage   = curpage;
  1381.    rcurr_page = curr_page;
  1382.    rarthd     = arthd;
  1383.  
  1384.    if(tmplate_flag)        /* take care of preview window */
  1385.    {                /* and other tmplate page      */
  1386.       arthd = ((curr_page % 2)?(ltarthd):(rtarthd));
  1387.       pagehd = curpage = ((curr_page%2)?(left_tmplate):(right_tmplate));
  1388.       curr_page = pagehd->pagenum;
  1389.       recalc_txtptrs();
  1390.  
  1391.       arthd = tarthd;        /* recalc preview text */
  1392.       pagehd = tpagehd;
  1393.       curpage = tcurpage;
  1394.       curr_page = temp_page;
  1395.       recalc_txtptrs();
  1396.    }
  1397.    else                /* recalc left and right tmplates*/
  1398.    {
  1399.       arthd = ltarthd;
  1400.       pagehd = curpage = left_tmplate;
  1401.       curr_page = pagehd->pagenum;
  1402.       recalc_txtptrs();        /* recalc left tmplate page */      
  1403.  
  1404.       arthd = rtarthd;        /* and recalc right tmplate */
  1405.       pagehd = curpage = right_tmplate;
  1406.       curr_page = pagehd->pagenum;
  1407.       recalc_txtptrs();
  1408.    }
  1409.    pagehd    = rpagehd;            /* restore previous settings */
  1410.    curpage   = rcurpage;
  1411.    curr_page = rcurr_page;
  1412.    arthd     = rarthd;
  1413. }
  1414.  
  1415.  
  1416.  
  1417. /**************************************************************************/
  1418. /* Function: output_doc()                          */
  1419. /* Description: kicks out a file to either the printer or a TDO file...   */
  1420. /**************************************************************************/
  1421. output_doc()
  1422. {
  1423.     int pagenum;
  1424.     int button;
  1425.     int copies;
  1426.     int lastpage;
  1427.     int firstp;
  1428.     int lastp;
  1429.     int firstpage;
  1430.  
  1431.     PAGE *rpagehd;
  1432.     PAGE *rcurpage;
  1433.     int  rtemp_page;
  1434.     int  tdisp_flag;
  1435.     int  rtmplate_flag;
  1436.     int  timage_status;
  1437.     ARTICLE *rarthd;
  1438.     int pxy[4];
  1439.     long freemem;
  1440.     int mem_needed;
  1441.     int device;
  1442.     int tview;
  1443.  
  1444.     int dxres,dyres;
  1445.  
  1446.     rtmplate_flag = tmplate_flag;
  1447.     rtemp_page = curr_page;
  1448.     timage_status = image_status;
  1449.     image_status = TRUE;
  1450.  
  1451.     if(tmplate_flag)
  1452.     {
  1453.       rpagehd = pagehd;
  1454.       rcurpage = curpage;
  1455.       rarthd   = arthd;
  1456.  
  1457.       pagehd = tpagehd;
  1458.       curpage = tcurpage;
  1459.       arthd   = tarthd;
  1460.  
  1461.       tmplate_flag = FALSE;
  1462.     }
  1463.  
  1464.  
  1465.     tdisp_flag = displ_tmpl_flag;
  1466.     displ_tmpl_flag = TRUE;
  1467.  
  1468.     graf_mouse(ARROW,&dummy);
  1469.     mem_needed = 0;
  1470.     device = OTDO;
  1471.  
  1472.     if(get_fpage(&pagenum))
  1473.     {
  1474.         set_int(adoutput,OFROMPAG,pagenum);
  1475.         firstpage = pagenum;
  1476.         do
  1477.         {
  1478.             lastpage = pagenum;
  1479.         }while(get_npage(&pagenum));
  1480.  
  1481.         set_int(adoutput,OTOPAGE,lastpage);
  1482.         set_int(adoutput,OCOPIES,1);
  1483.         adoutput[OPRINTER].ob_state = SELECTED;
  1484.         if(pagetype > PLEGAL)
  1485.            adoutput[OTDO].ob_state = DISABLED;
  1486.     else
  1487.            adoutput[OTDO].ob_state = NORMAL;
  1488.  
  1489.         button = execform(adoutput,OCOPIES);
  1490.         graf_mouse(BUSY_BEE,&dummy);            /* busy bee     */
  1491.         adoutput[button].ob_state = NORMAL;        /* reset button */
  1492.  
  1493.  
  1494.         if(button == OPRINT)
  1495.         {
  1496.        copies = get_int(adoutput,OCOPIES);
  1497.        firstp = max(get_int(adoutput,OFROMPAG),firstpage);
  1498.        lastp = min(get_int(adoutput,OTOPAGE),lastpage);
  1499.        if(lastp < firstp)
  1500.             lastp = 9999;
  1501.        
  1502.        if(deferhj)            /* if H&J deferred, recalc text)*/
  1503.        {
  1504.         menu_icheck(ad_menu,ADEFER,0);
  1505.         deferhj = 0;
  1506.              tview = view_size;
  1507.         view_size = PACTUAL;
  1508.         recalc_alt_text();
  1509.                  view_size = tview;                
  1510.            }
  1511.        if(!deferhj && view_size == PADJCNT)
  1512.            {
  1513.            tview = view_size;
  1514.            view_size = PACTUAL;
  1515.            recalc_alt_text();
  1516.            view_size = tview;                
  1517.            }
  1518.        
  1519.            
  1520.            if(adoutput[OPRINTER].ob_state == SELECTED)
  1521.            {
  1522.            device = OPRINTER;
  1523.                freemem = Malloc(-1L);
  1524.                if(freemem < 1230000L)
  1525.                {
  1526.           mem_needed = 1;
  1527.           Mfree(page_ptr);        /* Free page buffer  */
  1528.                }
  1529.  
  1530.                  if(!laser_open(0L,0,0))
  1531.                 alert_cntre(ALERT3);
  1532.              else
  1533.                  {
  1534.             if(pagetype > PLEGAL)
  1535.             {
  1536.             laser_MFDB.fd_w = pyres;
  1537.             laser_MFDB.fd_h = pxres;
  1538.             laser_MFDB.fd_wdwidth = (pyres + 15)/16;
  1539.                    GDvq_extnd(mhandle,0,intout,pyres,pxres,&pageim);
  1540.                         /* Set clip...        */
  1541.                pxy[0] = pxy[1] = 0;
  1542.                    pxy[2] = pyres;
  1543.                    pxy[3] = pxres;
  1544.                    vs_clip(phandle,1,pxy);
  1545.  
  1546.                 daveptr = lmalloc(20000L);
  1547.                   if(!daveptr)        /* memory for Dave... */
  1548.             {            /* for rotation buffer*/
  1549.                    alert_cntre(ALERT3);
  1550.                goto leave;        /* yes ugly eh?       */
  1551.             }
  1552.             }
  1553.             laser_out(firstp,lastpage,mem_needed,copies,lastp);
  1554.                    
  1555. leave:            laser_close();
  1556.             IF_close();            /* clear the font cache*/
  1557.             IF_open(0);
  1558.                  }
  1559.  
  1560.               print_flag = FALSE;    
  1561.               if(mem_needed)
  1562.               {
  1563.                   page_ptr = pagesc = (unsigned long) Malloc(prev_bytes);
  1564.                   page_MFDB.fd_addr = page_ptr;
  1565.               GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);
  1566.                  }
  1567.         
  1568.           if((pagetype > PLEGAL) && !mem_needed) /* reset ptrs...*/
  1569.                  GDvq_extnd(mhandle,0,intout,mxres,myres,&page_ptr);    
  1570.           mclip();
  1571.            }  
  1572.            else                 /* TDO        */
  1573.            {
  1574.              device = OTDO;
  1575.              force_blit_redraw(0);
  1576.          tdo_out(firstp,lastpage,lastp,copies);
  1577.            }
  1578.  
  1579.        }                  /* End of Ok BUTTON TO PRINT */
  1580.  
  1581.     }           /* end of no pages to print in the first place */
  1582.  
  1583.     tmplate_flag = rtmplate_flag;
  1584.     curr_page = rtemp_page;
  1585.     image_status = timage_status;
  1586.     if(tmplate_flag)
  1587.     {
  1588.       pagehd = rpagehd;
  1589.       curpage = rcurpage;
  1590.       arthd   = rarthd;
  1591.     }
  1592.     if(device == OPRINTER)
  1593.     {
  1594.  
  1595.        if(view_size == PADJCNT)
  1596.         recalc_alt_text();
  1597.     }
  1598.     displ_tmpl_flag = tdisp_flag;
  1599.     if(mem_needed)
  1600.     force_preview();
  1601.     graf_mouse(ARROW,&dummy);
  1602. }
  1603.  
  1604.  
  1605.  
  1606.  
  1607. laser_out(firstp,lastpage,mem_needed,copies,lastp)
  1608. int firstp;
  1609. int lastpage;
  1610. int mem_needed;
  1611. int copies;
  1612. int lastp;
  1613. {
  1614.     int event;
  1615.     int key;
  1616.     int pagenum;
  1617.     int pxy[4];
  1618.     int dummy;
  1619.     int tmp_buff[8];
  1620.     int rmu[4];
  1621.     int gflag;
  1622.     long rptr;
  1623.  
  1624.     if(copies > 1)
  1625.     v_pgcount(phandle,--copies);
  1626.  
  1627.     if(pagetype <= PLEGAL)    /* why load the laser fonts if doing */
  1628.     {                /* Landscape? Since we draw with the */
  1629.       if(phandle)        /* Memory driver this time only...   */
  1630.          init_text(phandle);
  1631.     }
  1632.     print_flag = TRUE;
  1633.     
  1634.     force_blit_redraw(mem_needed);  /* SLM 804      */
  1635.     
  1636.     if((get_fpage(&pagenum)) && (firstp <= lastpage) )
  1637.     {
  1638.     while(pagenum < firstp)
  1639.         get_npage(&pagenum);
  1640.         do
  1641.         {
  1642.            graf_mouse(BUSY_BEE,&dummy);            /* busy bee     */
  1643.  
  1644.        if(view_size == PADJCNT)
  1645.        {
  1646.          if(pagenum % 2)
  1647.          {
  1648.                rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1649.            while(rptr)
  1650.            {
  1651.           if(!gflag)
  1652.             free_regslv(rptr);
  1653.           rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1654.            }
  1655.          }
  1656.         }
  1657.  
  1658.        curr_page = pagenum;
  1659.        redraw_laser(pagenum);
  1660.  
  1661.        pxy[0] = pxy[1] = 0;
  1662.            pxy[2] = pxres;
  1663.            pxy[3] = pyres;
  1664.            vs_clip(phandle,1,pxy);
  1665.  
  1666.            rptr = get_fregion(pagenum,&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1667.        while(rptr)
  1668.        {
  1669.         if(!gflag)
  1670.             free_regslv(rptr);
  1671.         rptr = get_nregion(&rmu[0],&rmu[1],&rmu[2],&rmu[3],&gflag);
  1672.        }
  1673.        event = evnt_multi((MU_KEYBD|MU_TIMER),
  1674.                  0,0,0,
  1675.                  0,0,0,0,0,
  1676.                  0,0,0,0,0,
  1677.                  tmp_buff,
  1678.                  0,0,        /* timer == 0 */
  1679.                  &dummy,&dummy,
  1680.                  &dummy,&dummy,
  1681.                  &key,&dummy);
  1682.  
  1683.        if(event != MU_TIMER)
  1684.               break;
  1685.  
  1686.         }while((get_npage(&pagenum)) && (pagenum <= lastp));
  1687.     }
  1688. }
  1689.  
  1690.  
  1691.  
  1692.  
  1693. tdo_out(firstp,lastpage,lastp,copies)
  1694. int firstp;
  1695. int lastpage;
  1696. int lastp;
  1697. int copies;
  1698. {
  1699.  
  1700.     int dummy;
  1701.     int pagenum;
  1702.     int count;
  1703.     int i;
  1704.  
  1705.     strcpy(pathbuf,dpath4);
  1706.     strcat(pathbuf,"*.TYF");
  1707.     if(!get_fs(fbuffer,&dummy))
  1708.     return;
  1709.     extender(fbuffer,".TYF");
  1710.     Fsetdta(&thedta.res[0]);
  1711.     if(Fsfirst(fbuffer,0)==0)
  1712.     {
  1713.     if(alert_cntre(ALERT37)==2)
  1714.         {
  1715.        return;
  1716.         }
  1717.     }
  1718.     if((TYF_handle=Fcreate(fbuffer,0)) <= 0)
  1719.     {
  1720.     alert_cntre(ALERT19);
  1721.         return;
  1722.     }
  1723.     
  1724.     Start_TYF();    
  1725.  
  1726.     if((get_fpage(&pagenum)) && (firstp <= lastpage))
  1727.     {
  1728.     while(pagenum < firstp)
  1729.         get_npage(&pagenum);
  1730.     if(copies == 0) copies = 1;
  1731.         count = copies;
  1732.     do
  1733.         {
  1734.          curr_page = pagenum;
  1735.          for(i=1;i<=count;i++)
  1736.                  redraw_tdo(pagenum,lastp);
  1737.         }while((get_npage(&pagenum)) && (pagenum <= lastp));
  1738.     }
  1739.     End_TYF();
  1740.     Fclose(TYF_handle);
  1741.  
  1742. }
  1743.  
  1744.  
  1745.